package blackjack;

public class Banco {

    private Mazzo mazzo;
    private Carta[][] tavolo;
    private int[] numcarte;
    private boolean insurancepay;
    private boolean insurance;
    private int bet;

    public Banco() {
        this.mazzo = new Mazzo();
        this.mazzo.shuffle();
        this.tavolo = new Carta[2][5];
        this.numcarte = new int[2];
        this.insurancepay = false;
        this.insurance = false;
    }

    public void start() {
        this.tavolo[0][0] = this.mazzo.getCarta(0);
        this.tavolo[1][0] = this.mazzo.getCarta(1);
        this.tavolo[1][0].setCoperta(true);
        this.tavolo[0][1] = this.mazzo.getCarta(2);
        this.tavolo[1][1] = this.mazzo.getCarta(3);
        this.numcarte[0] = 2;
        this.numcarte[1] = 2;
    }

    public void carta(int pWho) {
        this.tavolo[pWho][this.numcarte[pWho]] = this.mazzo.getCarta(this.numcarte[0] + this.numcarte[1]);
        this.numcarte[pWho]++;
    }

    public int getPunteggio(int pWho) {
        int giocatore = 0;
        boolean isAnAce = false;
        int numAce = 0;
        for (int i = 0; i < this.numcarte[pWho]; i++) {
            if (!this.tavolo[pWho][i].isCoperta()) {
                giocatore = giocatore + this.tavolo[pWho][i].getValore();
                if (this.tavolo[pWho][i].getNumero().equals("1")) {
                    isAnAce = true;
                    numAce++;
                }
            }
        }
        for (int i = 0; i < numAce; i++) {
            if (giocatore > 21 && isAnAce) {
                giocatore = giocatore - 10;
            }
        }
        return giocatore;
    }

    public int getBet() {
        return bet;
    }

    public void setBet(int pBet) {
        if(pBet>0){
            this.bet = pBet;
        }
    }

    public boolean isWinner() {
        int giocatore = this.getPunteggio(0);
        int banco = this.getPunteggio(1);
        if (giocatore > banco && giocatore <= 21 || (banco > 21)) {
            return true;
        }
        return false;
    }

    public int pay() {
        int retval = 0;
        if (this.isWinner()) {
            retval = this.bet * 2;
        }
        if (this.isBlackJack(0) && !this.isBlackJack(1)) {
            retval = (this.bet * 2) + (this.bet / 2);
        }

        if (this.insurancepay) {
            retval = retval + this.bet;
        }
        return retval;
    }

    public boolean isBlackJack(int pWho) {
        if ((this.tavolo[pWho][0].getNumero().equals("1") || this.tavolo[pWho][1].getNumero().equals("1")) && (this.tavolo[pWho][0].getValore() == 10 || this.tavolo[pWho][1].getValore() == 10)) {
            return true;
        }
        return false;
    }

    public void play() {
        this.tavolo[1][0].setCoperta(false);
        if (!this.isSballato()) {
            while (this.getPunteggio(1) < 17 && this.numcarte[1] <= 5) {
                this.carta(1);
            }
        }
    }

    public Carta[] getCarte(int pWho) {
        Carta[] carte = new Carta[this.numcarte[pWho]];
        for (int i = 0; i < this.numcarte[pWho]; i++) {
            carte[i] = this.tavolo[pWho][i];
        }
        return carte;
    }

    public boolean isInsurancePossible() {
        if (this.tavolo[1][1].getNumero().equals("1")) {
            return true;
        }
        return false;
    }

    public int getNumCarte(int pWho) {
        return this.numcarte[pWho];
    }

    public boolean isSballato() {
        if (this.getPunteggio(0) > 21) {
            return true;
        }
        return false;
    }

    public void setInsurance(boolean insurance) {
        this.insurancepay = insurance;
    }

    public boolean isInsurance() {
        return insurance;
    }

    public void setIns(boolean insurance) {
        this.insurance = insurance;
    }
}
